package haltica.com.mx.ape.web;

import flexjson.JSONSerializer;
import haltica.com.mx.ape.domain.EmpleadoSucursalTeclado;
import haltica.com.mx.ape.domain.Modem;
import haltica.com.mx.ape.domain.Requerimientos;
import haltica.com.mx.ape.domain.TecladoEsclusa;
import haltica.com.mx.ape.domain.TipoOperacion;
import haltica.com.mx.ape.util.UtilNumber;

import java.util.Calendar;
import java.util.Date;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.roo.addon.web.mvc.controller.RooWebScaffold;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@RooWebScaffold(path = "requerimientoses", formBackingObject = Requerimientos.class)
@RequestMapping("/requerimientoses")
@Controller
public class RequerimientosController {
	
	private static final String ERROR = "ERROR";
	private static final String ACK = "ACK";
	private static final String NOT_GRANTEND = "NOT_GRANTEND";
	private static final int CANT_CEROS = 5;
	

	/**
	 * s
	 * @param tipoOper
	 * @param idTeclado
	 * @param idEmpleado
	 * @param idImei
	 * @return
	 */
	@RequestMapping(value = "/crearReq", method = RequestMethod.POST)
	public ResponseEntity<String> createRequerimiento(
			@RequestParam(value="idReq", required = false) String tipoOper, 
			@RequestParam(value="idTeclado", required = false) String idTeclado, 
			@RequestParam(value="idUsuario", required = false) String idEmpleado,
			@RequestParam(value="idImei", required = false) String idImei) {

		TipoOperacion tipoOpe;
		HttpHeaders headers;
		TecladoEsclusa teclado;
		EmpleadoSucursalTeclado empleado;
		Requerimientos req;
		
		System.out.println(tipoOper);//OP_APER
		System.out.println(idTeclado);//00001 y 2
		System.out.println(idEmpleado);//00207 00305
		System.out.println(idImei);
		
		idTeclado = RequerimientosController.getIdFormat(idTeclado);
		idEmpleado = RequerimientosController.getIdFormat(idEmpleado);
		
		headers = new HttpHeaders();
		headers.set("Content-Type", "application/json");
		headers.add("Content-Type", "application/text; charset=utf-8");
		
		tipoOpe = TipoOperacion.findTipoOperacion(tipoOper);
		if (tipoOpe == null) {
			return new ResponseEntity<String>(RequerimientosController.ERROR, headers,
					HttpStatus.OK);
		}
		
		
		teclado = TecladoEsclusa.findTecladoEsclusa(idTeclado);
		if (teclado == null) {
			return new ResponseEntity<String>(RequerimientosController.ERROR, headers,
					HttpStatus.OK);
		}
		
		
		empleado = EmpleadoSucursalTeclado.findEmpleadoSucursalTeclado(idEmpleado);
		System.out.println("empleado: " + empleado);
		// validano si es amago
		if (empleado == null) {
			if (!tipoOper.equals("OP_AMAG")) {
				return new ResponseEntity<String>(RequerimientosController.ERROR, headers,
						HttpStatus.OK);
			}
		} else if (empleado.getEnabled().booleanValue() == false) {
			// Se verifica si el usuario esta activo
			return new ResponseEntity<String>(RequerimientosController.NOT_GRANTEND, headers,
					HttpStatus.OK);
		}
		
		req = new Requerimientos();
		
		req.setIdTecladoEsclusa(teclado);
		req.setIdEmpleadoSucTec(empleado);
		req.setIdTipoOper(tipoOpe);
		req.setNumImei(idImei);
		req.setActivo(Boolean.TRUE);
		req.setFechaCreacion(new Date());
		req.setIdUsuarioAutorizo(null);
		req.setAutorizado(null);
		req.setFechaAutorizacion(null);
		
		try {
			req.persist();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		System.out.println(RequerimientosController.ACK  + ";" + req.getIdReq());
		return new ResponseEntity<String>(RequerimientosController.ACK  + ";" + req.getIdReq(),
				headers, HttpStatus.OK);
	}
	
	
	/**
	 * 
	 * @param idRequerimiento
	 * @return
	 */
	@RequestMapping(value = "/readRequerimiento", method = RequestMethod.GET)
	public ResponseEntity<String> readRequerimiento(
			@RequestParam(value = "id", required = false) Integer idRequerimiento) {
		
		HttpHeaders headers;
		String json;
		GenericResponse gRes;
		ResponseEntity<String> response;
		Requerimientos req;
		
		headers = new HttpHeaders();
		headers.set("Content-Type", "application/json");
		headers.add("Content-Type", "application/text; charset=utf-8");
		
		
		System.out.println(idRequerimiento);
		req = Requerimientos.findRequerimientos(idRequerimiento);
		
		gRes = new GenericResponse(Boolean.TRUE, req);
		json = new JSONSerializer().exclude("*.class").serialize(gRes);
		
		response = new ResponseEntity<String>(json, headers, HttpStatus.OK);
		
		return response; 
	}
	
	/**
	 * 
	 * @param idRequerimiento
	 * @param autorizado
	 * @return
	 */
	@RequestMapping(value = "/autorizarReq", method = RequestMethod.POST)
	public ResponseEntity<String> autorizarReq(
			@RequestParam(value = "idReq", required = true) Integer idRequerimiento,
			@RequestParam(value = "autorizado", required = true) Boolean autorizado) {
		
		HttpHeaders headers;
		String json;
		GenericResponse gRes;
		ResponseEntity<String> response;
		Requerimientos req;
		
		headers = new HttpHeaders();
		headers.set("Content-Type", "application/json");
		headers.add("Content-Type", "application/text; charset=utf-8");
		
		req = Requerimientos.findRequerimientos(idRequerimiento);
		
		
		System.out.println("autorizado: "+ autorizado);
		req.setAutorizado(autorizado);
		req.setIdUsuarioAutorizo(1);
		req.setFechaAutorizacion(new Date());
		
		req.merge();
		
		gRes = new GenericResponse(Boolean.TRUE, req);
		json = new JSONSerializer().exclude("*.class").serialize(gRes);
		
		response = new ResponseEntity<String>(json, headers, HttpStatus.OK);
		
		Date now = new Date();
		Calendar cal = Calendar.getInstance();
		cal.setTime(now);
		cal.add(Calendar.MINUTE, -5);
		
		System.out.println(now);
		System.out.println(cal.getTime());
		
		
		return response; 
	}
	
	/**
	 * 
	 * @param tipoOper
	 * @param idTeclado
	 * @param idEmpleado
	 * @param idImei
	 * @param idReq
	 * @return
	 */
	@RequestMapping(value = "/pingReq", method = RequestMethod.POST)
	public ResponseEntity<String> pingRequerimiento(
			@RequestParam(value="idReq", required = false) String tipoOper, 
			@RequestParam(value="idTeclado", required = false) String idTeclado, 
			@RequestParam(value="idUsuario", required = false) String idEmpleado,
			@RequestParam(value="idImei", required = false) String idImei,
			@RequestParam(value="idSecReq", required = false) Integer idReq) {

		TipoOperacion tipoOpe;
		HttpHeaders headers;
		TecladoEsclusa teclado;
		EmpleadoSucursalTeclado empleado;
		Requerimientos req;
		String response;
		
		System.out.println(tipoOper);//OP_APER
		System.out.println(idTeclado);//00001 y 2
		System.out.println(idEmpleado);//00207 00305
		System.out.println(idImei);
		System.out.println(idReq);
		
		idTeclado = RequerimientosController.getIdFormat(idTeclado);
		idEmpleado = RequerimientosController.getIdFormat(idEmpleado);
		
		headers = new HttpHeaders();
		headers.set("Content-Type", "application/json");
		headers.add("Content-Type", "application/text; charset=utf-8");
		
		tipoOpe = TipoOperacion.findTipoOperacion(tipoOper);
		if (tipoOpe == null) {
			return new ResponseEntity<String>(RequerimientosController.ERROR, headers,
					HttpStatus.OK);
		}
		
		teclado = TecladoEsclusa.findTecladoEsclusa(idTeclado);
		if (teclado == null) {
			return new ResponseEntity<String>(RequerimientosController.ERROR, headers,
					HttpStatus.OK);
		}
		
		req = Requerimientos.findRequerimientos(idReq);
		
		if(!req.getIdTipoOper().getIdTipoOper().equals("OP_AMAG")){
			empleado = EmpleadoSucursalTeclado.findEmpleadoSucursalTeclado(idEmpleado);
			if (empleado == null) {
				return new ResponseEntity<String>(RequerimientosController.ERROR, headers,
						HttpStatus.OK);
			}
		}
		
		
		if (req.getActivo().booleanValue() == false) {
			// se invalida por ni estar activo
			response = "NO";
		} else if (req.getAutorizado() == null) {
			response = "RETRY";
		} else if (req.getAutorizado().booleanValue() == false) {
			response = "NO";
		} else {
			response = "OK";
		}
		
		return new ResponseEntity<String>(response, headers, HttpStatus.OK);
	}
	

	/**
	 * 
	 * @param tipoOper
	 * @param idImei
	 * @return
	 */
	@RequestMapping(value = "/sincReq", method = RequestMethod.POST)
	public ResponseEntity<String> sincronizarReq(
			@RequestParam(value = "idReq", required = true) String tipoOper,
			@RequestParam(value = "idImei", required = true) String idImei) {
		
		TipoOperacion tipoOpe;
		HttpHeaders headers;
		Modem modem;
		String response;
		
		System.out.println(tipoOper);//OP_SYNC
		System.out.println(idImei);//123451234567890
		
		
		headers = new HttpHeaders();
		headers.set("Content-Type", "application/json");
		headers.add("Content-Type", "application/text; charset=utf-8");
		
		tipoOpe = TipoOperacion.findTipoOperacion(tipoOper);
		
		if (tipoOpe == null) {
			return new ResponseEntity<String>(RequerimientosController.ERROR, headers,
					HttpStatus.OK);
		}
		
		
		response = "";
		modem = Modem.findModemByImei(idImei);
		
		// obtenemos el id de teclado
		for (TecladoEsclusa teEsc : modem.getTecladoEsclusas()) {
			response = "idTeclado:"
					+ UtilNumber.addCerosIzq(
							Integer.parseInt(teEsc.getIdTecladoEsclusa()),
							RequerimientosController.CANT_CEROS) + ";";
		}
		
		response += "nombreSuc:" + modem.getIdSucursal().getNombreCortoSucursal() + ";";
		
		response += "listIdUsu:";
		for (EmpleadoSucursalTeclado empleadoSuc : modem.getIdSucursal().getEmpleadoSucursalTecladoes()) {
			if (empleadoSuc.getEnabled().booleanValue())
				response += UtilNumber.addCerosIzq(
						Integer.parseInt(empleadoSuc.getIdEmpleadoSucTec()),
						RequerimientosController.CANT_CEROS) + ",";
		}
		
		response += ";";
		
		System.out.println(response);
		
		return new ResponseEntity<String>(response, headers, HttpStatus.OK);
	}
	
	/**
	 * 
	 * @param id
	 * @return
	 */
	private final static String getIdFormat(String id) {
		Integer idFmt;

		idFmt = UtilNumber.getNumber(id);
		if (idFmt == null) {
			System.out.println("Error id sin formato: " + id);
			return null;
		} else {
			return idFmt.toString();
		}
	}
}
